package com.lin.forum.service.impl;

import com.lin.forum.common.Result;
import com.lin.forum.common.ResultCodeEnum;
import com.lin.forum.dao.UserMapper;
import com.lin.forum.exception.ApplicationException;
import com.lin.forum.mapper.UserInfoMapper;
import com.lin.forum.model.User;
import com.lin.forum.service.IUserService;
import com.lin.forum.utils.JwtUtils;
import com.lin.forum.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@Service
public class UserServiceImpl implements IUserService {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Autowired
    private UserMapper userMapper;
    /**
     * 根据用户姓名，查询信息
     * @param userName 用户名
     * @return 用户信息
     */
    public User selectUserInfoByName(String userName) {
        //非空校验
        if(userName==null||!StringUtils.hasLength(userName)){
            log.warn("在UserServiceImpl，根据用户姓名，查询信息selectUserInfoByName,userName为空，参数为：userName="+userName);
            throw new ApplicationException(Result.fail(ResultCodeEnum.FAILED_PARAMS_VALIDATE));
        }
        return userInfoMapper.selectByName(userName);
    }

    /**
     * 创建一个普通用户
     * @param user 用户对象
     * log.warn()：记录 警告信息，表示潜在问题，但不影响系统正常运行。
     * 示例：配置参数非最优值、资源快耗尽（如内存使用率过高）。
     * log.error()：记录 错误信息，表示系统发生了无法正常处理的故障。
     * 示例：数据库连接失败、空指针异常、关键业务逻辑中断。
     */
    @Override
    public void createNormalUser(User user) {
        //1.非空校验
        if(user==null
                ||!StringUtils.hasLength(user.getUsername())
                ||!StringUtils.hasLength(user.getNickname())
                ||!StringUtils.hasLength(user.getPassword())
                ||!StringUtils.hasLength(user.getSalt())){
            log.warn("在UserServiceImpl，创建一个普通用户createNormalUser,参数user中的参数为空，参数为：user="+user);
            //抛出异常
            throw new ApplicationException(Result.fail(ResultCodeEnum.FAILED_PARAMS_VALIDATE));
        }
        //2.判断用户是否存在
        User existsUser= userInfoMapper.selectByName(user.getUsername());
        if(existsUser!=null){
            log.warn("在UserServiceImpl，创建一个普通用户createNormalUser,第二步判断用户是否存在出现错误，查询的用户不存在");
            //抛出异常
            throw new ApplicationException(Result.fail(ResultCodeEnum.FAILED_USER_EXISTS));
        }
        //3.新增用户 设备默认值
        user.setGender((byte) 2);
        user.setArticleCount(0);
        user.setIsAdmin((byte) 0);
        user.setState((byte) 0);
        user.setDeleteState((byte) 0);
        //当前日期
        Date date=new Date();
        user.setCreateTime(date);
        user.setUpdateTime(date);
        //写入数据库
        int row=userMapper.insertSelective(user);
        if(row!=1){
            log.warn("在UserServiceImpl，创建一个普通用户createNormalUser,第三步新增用户 写入数据库出现错误，新增用户插入mysql失败");
            //抛出异常
            throw new ApplicationException(Result.fail(ResultCodeEnum.FAILED_CREATE));
        }
    }

    /**
     * 用户登录
     * @param username 用户名
     * @param password 密码
     * @return 状态
     */
    @Override
    public String login(String username, String password) {
        if(username==null||password==null||!StringUtils.hasLength(username)||!StringUtils.hasLength(password)){
            log.info("在UserServiceImpl，用户登录login,传入的参数为null： username="+username+"password="+password);
            throw new ApplicationException(Result.fail(ResultCodeEnum.FAILED_PARAMS_VALIDATE.getCode(),"账号或密码不能为空"));
        }
        //验证账号是否正确
        User userInfo= selectUserInfoByName(username);
        //判断用户是否存在
        if(userInfo==null||userInfo.getId()==null){
            log.warn("在UserServiceImpl，用户登录login,查询到用户不存在");
            throw new ApplicationException(Result.fail(ResultCodeEnum.FAILED_USER_NOT_EXISTS.getCode(),ResultCodeEnum.FAILED_USER_NOT_EXISTS.getMessage()));
        }
        //验证密码是否正确
        if(!SecurityUtils.verify(password,userInfo.getPassword())){
            log.warn("在UserServiceImpl，用户登录login,密码错误");
            throw new ApplicationException(Result.fail(ResultCodeEnum.FAILED_LOGIN.getCode(), ResultCodeEnum.FAILED_LOGIN.getMessage()));
        }
        //账号密码正确的逻辑
        Map<String,Object> claims=new HashMap<>();
        claims.put("id",userInfo.getId());
        claims.put("name",userInfo.getUsername());
        String jwt= JwtUtils.genJwt(claims);
        return jwt;
    }

    /**
     * 根据id查询用户信息
     * @param id 用户id
     * @return 用户信息
     */
    @Override
    public User selectById(Integer id) {
        if(id==null){
            log.warn("在UserServiceImpl，根据id查询用户信息selectById,参数id为空，参数为：id="+id);
            //抛出异常
            throw new ApplicationException(Result.fail(ResultCodeEnum.FAILED_PARAMS_VALIDATE));
        }
        User user=userMapper.selectByPrimaryKey(id);
        return user;
    }
}
